package com.jiuyue.demo.mysqlpdf;

public class MySqlController {
	
	
	/**
	 * Mysql会解析查询,并建立内部数据结构(解析树),然后对其进行各种优化,包括 重写查询 决定表的读取顺序 选择合适的索引
	 * 用户可以用特殊的关键字（hint)优化器,影响它的决策过程
	 * 也可以请求优化解释器(explain)优化过程的各个因素,使用户可以知道服务器是如何进行优化决策的
	 * 
	 * 
	 * 无论如何 多个查询需要在同一个时刻修改数据 都会产生并发控制问题 Mysql在两个层面并发控制的问题 服务器层和存储引擎层
	 * 
	 * 一种提高共享资源并发性的方式就是让锁对象更有选择性 锁策略就是 锁的开销和数据的安全性之间寻求平衡 每种myql存储引擎都有自己的锁策略和锁颗粒度
	 * table lock 表锁 表锁是mysql最基本的锁策略 是开销最小的锁策略 row lock 行锁可以最大程度的支持并发处理,同时也带来了最大的锁开销
	 * 行级锁只在存储引擎层
	 * 
	 * 事务 ACID 事务可以增加开销 原子性 atomictiy 一个事务必须是不可分割的最小工作单元 整个事务中的所有操作要么全部成功 要么全部失败 一致性
	 * consistency 数据库总是从一个一致性状态到另外一个一致性状态 隔离性 isolation 一个事务所做的修改在最终提交之前,对其他事务是不可见的
	 * 持久性 durability 一旦事务提交 则其所做的修改就会永久保存到数据库中
	 *
	 * 隔离级别 isolation READ UNCOMITTED 未提交读 事务中未提交的修改 其他事务也可见 脏读 READ COMMITTED 提交读
	 * 事务中未提交的修改 其他事务不可见 不可重复读 两次查询结果可能不一致 REPEATABLE READ 可重复读 解决了脏读的问题
	 * 同一个事务多次读结果一直 但是会出现 幻读 所谓幻读就是 事务读取一个范围内的数据时 其他事务插入一条记录 之前 的事务再读取一个范围内的数据 会产生幻行
	 * InnoDB XtraDa存储引擎 通过多版本控制（MVCC)解决了幻读问题 SERILIZABLE 可串行化 解决幻读问题 加行锁 开销最大
	 *
	 * 自动提交 mysql默认采用自动提交模式 如果不是显式的开始一个事务 则每个查询都被当作一个事务进行提交
	 *
	 * mysql服务器层不管理事务 是由下层存储引擎实现 所以在同一个事务中使用多个存储引擎是不可靠的 mysql大多数的事务性存储引擎都不是简单的行级锁
	 * 基于提升多并发性能实现的多版本（MVCC)并发控制 可以认为MVCC是行级锁的一个变种 MVCC是通过保存数据在某个时间点快照实现的
	 * InnoDB的MVCC是通过每行的两个隐藏列来实现的 这两个隐藏列一个保存了 行的 创建时间 一个保存了 行的 失效（删除）时间 存储的不是时间值
	 * 而是系统版本号 没开始一个新的事物 系统的版本号会自动递增 事务开始时刻的系统版本号 作为事务的版本号 用来和查询到的行记录的版本号进行比较
	 *
	 * 在文件系统中 MYSQL将每个数据库（也可以称为schema)保存为数据目录下的一个子目录 创建表时 会在数据库子目录创建一个与表同名的.frm文件
	 * 保存表的定义
	 *
	 * MyISAM不支持事务和行级锁 崩溃后无法自动恢复 MyISAM特性 加锁并发 MyISAM对整张表加锁,而不是针对行,
	 * 读取时会对需要读到的所有表加共享锁,写入时则对表加排他锁 但是在表有读取查询的同时,也可以往表中插入新的记录,这被称为并发插入（CONCURRENT
	 * INSERT)
	 *
	 * 修复 Schema与数据类型优化 mysql关于Schema的定义
	 * MySQL官方文档指出，从概念上讲，模式是一组相互关联的数据库对象，如表，表列，列的数据类型，索引，外键等等。
	 * 但是从物理层面上来说，模式与数据库是同义的。你可以在MySQL的SQL语法中用关键字SCHEMA替代DATABASE， 例如使用CREATE
	 * SCHEMA来代替CREATE DATABASE。 良好的逻辑设计和物理设计是高性能的基石
	 *  MySQL中各数据类型的取值范围
	 * 
	 * TINYINT -128 - 127 TINYINT UNSIGNED 0 - 255 SMALLINT -32768 - 32767 SMALLINT UNSIGNED 0 - 65535 MEDIUMINT -8388608 - 8388607 MEDIUMINT UNSIGNED 0 -
	 * 16777215 INT 或 INTEGER -2147483648 - 2147483647 INT UNSIGNED 或 INTEGER
	 * UNSIGNED 0 - 4294967295 BIGINT -9223372036854775808 - 9223372036854775807
	 * BIGINT UNSIGNED 0 - 18446744073709551615 FLOAT -3.402823466E+38 -
	 * -1.175494351E-38,0,1.175494351E-38 - 3.402823466E+38 DOUBLE 或 DOUBLE
	 * PRECISION 或 REAL -1.7976931348623157E+308 -
	 * -2.2250738585072014E-308,0,2.2250738585072014E-308 - 1.7976931348623157E+308
	 * DECIMAL[(M,[D])] 或 NUMERIC(M,D)
	 * 由M(整个数字的长度,包括小数点,小数点左边的位数,小数点右边的位数,但不包括负号)和D(小数点右边的位数)来决定,M缺省为10,D缺省为0 DATE
	 * 1000-01-01 - 9999-12-31 DATETIME 1000-01-01 00:00:00 - 9999-12-31 23:59:59
	 * TIMESTAMP 1970-01-01 00:00:00 - 2037年的某天(具体是哪天我也不知道,呵呵) TIME -838:59:59' to
	 * 838:59:59 YEAR[(2|4)] 缺省为4位格式,4位格式取值范围为1901 -
	 * 2155,0000,2位格式取值范围为70-69(1970-2069) CHAR(M) [BINARY] 或 NCHAR(M) [BINARY]
	 * M的范围为1 - 255,如果没有BINARY项,则不分大小写,NCHAR表示使用缺省的字符集.在数据库中以空格补足,但在取出来时末尾的空格将自动去掉.
	 * [NATIONAL] VARCHAR(M) [BINARY] M的范围为1 - 255.在数据库中末尾的空格将自动去掉. TINYBLOB 或
	 * TINYTEXT 255(2^8-1)个字符 BLOB 或 TEXT 65535(2^16-1)个字符 MEDIUMBLOB 或 MEDIUMTEXT
	 * 16777215 (2^24-1)个字符 LONGBLOB 或 LONGTEXT 4294967295 (2^32-1)个字符
	 * ENUM('value1','value2',...) 可以总共有65535个不同的值 SET('value1','value2',...)
	 * 最多有64个成员
	 *
	 *实数是带有小数部分的数字
	 *float和double类型支持按照标准的浮点运算进行近似计算
	 *Decimal类型用于存储精确的小数 CPU不支持Decimal进行精确运算 mysql服务器实现Decimal的运算  cpu支持原生的浮点运算
	 *
	 * mysql支持多种数据类型 下面几个简单的原则有助于做出更好的选择
	 *
	 * 更小的通常更好 简单就好 尽量避免null
	 *
	 * 在为列选择数据类型时 第一步需要确定合适的大类型 数字 字符串 时间等
	 *
	 *
	 *
	 *
	 *
	 *
	 *
	 *
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 */

}
